logo语言

这道题其实可以用纯模拟来做,把字符串看做一个算式,‘FD’相当于加,‘BK’相当于减,‘REPEAT’相当于乘,‘【】’相当于()。
详细解释见代码注释。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[260];//字符串
int b[]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};//用来处理字符串中的位数关系,一直到十亿
int num[7878]={1};//用来记录REPEAT(相当于乘)当前的数
int lena,now,pd,numn,len_num;//lena=字符串长度 now=当前距起点的距离 pd=1时表示前进,pd=2时表示后退,pd=3时表示REPEAT
//numn表示num数组当前下标 len_num用来为num数组加数
int main()//主程序(程序快乐的开始了)
{
gets(a);//输入 注:gets 一直读到回车('\n') scanf读到空格(' ') 所以要用gets
lena=strlen(a);//记录长度
for(int i=0;i<lena;)//处理
{
while(a[i]==' ')//空格跳过
i++;
if(i>=lena) break;//判断是否到头
if(a[i]=='[')//当出现‘【’时说明有REPEAT 以便乘num数组
{
numn++;
i++;
continue;
}
if(a[i]==']')//当出现‘】’时说明REPEAT结束 乘之前的num数组
{
numn--;
i++;
continue;
}
if(a[i]=='R'&&a[i+1]=='E')//处理REPEAT
{
pd=3;//防止处理前进或后退
i+=6;//往前处理
while(a[i]==' ')//跳过空格
i++;
int ii=0,iii=i;//处理数字
while(a[iii]>='0'&&a[iii]<='9')//符合数字范围
{
ii++;//用来记数的位数
iii++;//用来往前处理数字
}
int x=0;//数的总和
while(ii)//计算数的总和
{
x=int(a[i]-'0')*b[ii]+x;//当前数*位数+原来的数
ii--;//位数-1
i++;//往前处理
}
x*=num[numn];//乘之前的REPEAT
num[++len_num]=x;//加入新的乘数(REPEAT)
}
if(a[i]=='F'&&a[i+1]=='D')//处理前进
{
i+=2;//往前处理
pd=1;//用来表示前进
continue;
}
if(a[i]=='B'&&a[i+1]=='K')//处理后退
{
i+=2;//同上
pd=2;//用来表示后退
continue;
}
if(pd!=3)//处理前进或后退而不处理REPEAT
{
int ii=0,iii=i;//同上
while(a[iii]>='0'&&a[iii]<='9')
{
ii++;
iii++;
}
int x=0;
while(ii)
{
x=int(a[i]-'0')*b[ii]+x;
ii--;
i++;
}
x*=num[numn];
if(pd==1) now+=x;//如果前进 +
else if(pd==2) now-=x;//如果后退 -
}
pd=0;//pd归零
}
if(now<0) now=0-now;//处理负数(求绝对值,可用abs(cmath))
printf("%d",now);//输出
return 0;//程序快乐的结束了
}